﻿//using System;
//using System.Collections.Generic;
//using System.IO;
//using System.Linq;
//using VsxFactory.Modeling.VisualStudio;
//using VsxFactory.Modeling.VisualStudio.Synchronization;
//using Microsoft.VisualStudio.Modeling;

//namespace VsxFactory.Modeling.Strategies.Rules
//{
//    public class MemberTypeGenerationRule : BaseGenerationRule
//    {
//        private TypeGenerationRule _typeGenerationRule;
//        public Action<StrategyContext, ModelElement, object, string> GenerateMember { get; set; }
//        public Action<StrategyContext, ModelElement, object> RemoveMember { get; set; }
//        private Guid ownerClassGuid;

//        public MemberTypeGenerationRule(TypeGenerationRule parentGenerationRule, Guid ownerClassGuid)
//        {
//            Guard.ArgumentNotNull(parentGenerationRule, "parentGenerationRule");
//            _typeGenerationRule = parentGenerationRule;
//            this.ownerClassGuid = ownerClassGuid;
//        }

//        public override IProjectItem GetCurrentNode(StrategyContext context, GenerationElementWrapper element)
//        {
//            return _typeGenerationRule.GetCurrentNode(context, element);
//        }

//        protected virtual GenerationElementWrapper GetParentElement<T1>(ModelElement mel)
//        {
//            foreach (var embed in mel.Store.DomainDataDirectory.FindDomainClass(ownerClassGuid).AllEmbeddedByDomainRoles)
//            {
//                if (embed.RolePlayer.ImplementationClass == typeof(T1))
//                {
//                    foreach (var linkedElement in embed.OppositeDomainRole.GetElementLinks(mel).First().LinkedElements)
//                    {
//                        GenerationElementWrapper e = GetElementWrapper(linkedElement);
//                        if (e != null)
//                            return e;
//                    }
//                }
//            }
//            return null;
//        }

//        protected virtual void GenerateMemberCode(StrategyContext context, ModelElement mel, EnvDTE.CodeElement ce, string oldName)
//        {
//            if (GenerateMember != null)
//                GenerateMember(context, mel, ce, oldName);
//        }

//        public sealed override bool Generate(StrategyContext context, GenerationElementWrapper wrapper)
//        {
//            ModelElement mel = wrapper.ModelElement;
//            var parent = GetParentElement<TType>(mel);
//            if (parent == null)
//                return false;

//            var node = GetCurrentNode(context, parent);
//            if (node != null)
//            {
//                var fcm = node.ProjectItem.FileCodeModel;
//                if (fcm != null)
//                {
//                    var ce = IncrementalGenerator.RecursiveFind<EnvDTE.CodeElement>(fcm.CodeElements, c => c.FullName == parent.FullName);
//                    if (ce != null)
//                    {
//                        GenerateMemberCode(context, mel, ce, null);
//                        return true;
//                    }
//                }
//            }
//            return false;
//        }

//        protected virtual bool RemoveMemberCode(StrategyContext ctx, ModelElement mel, EnvDTE.CodeElement parent, EnvDTE.CodeElement member)
//        {
//            if (RemoveMember != null)
//                RemoveMember(ctx, mel, parent);
//            else if (member is EnvDTE.CodeFunction)
//                (((EnvDTE.CodeFunction)member).Parent as EnvDTE.CodeType).RemoveMember(member);
//            else if (member is EnvDTE.CodeProperty)
//                (((EnvDTE.CodeProperty)member).Parent as EnvDTE.CodeType).RemoveMember(member);
//            else if (member is EnvDTE.CodeVariable)
//                (((EnvDTE.CodeVariable)member).Parent as EnvDTE.CodeType).RemoveMember(member);
//            else
//                return false;
//            return true;
//        }

//        public sealed override void Remove(StrategyContext ctx, GenerationElementWrapper wrapper)
//        {
//            ModelElement mel = wrapper.ModelElement;
//            var parent = GetParentElement<TType>(mel);
//            if (parent == null)
//                return;
//            var node = GetCurrentNode(ctx, parent);
//            if (node!=null)
//            {
//                var fcm = node.ProjectItem.FileCodeModel;
//                if (fcm != null)
//                {
//                    var ce = IncrementalGenerator.RecursiveFind<EnvDTE.CodeElement>(fcm.CodeElements, c => c.FullName == parent.FullName);
//                    if (ce != null)
//                    {
//                        var cm = IncrementalGenerator.RecursiveFind<EnvDTE.CodeElement>(ce.Collection, c => c.Name == wrapper.Name);
//                        if (cm != null)
//                        {
//                            RemoveMemberCode(ctx, mel, ce, cm);
//                        }
//                    }
//                }
//            }
//        }

//        public override void Change(StrategyContext context, GenerationElementWrapper wrapper, Guid propertyId, object oldValue)
//        {
//            ModelElement mel = wrapper.ModelElement;
//            var parent = GetParentElement<TType>(mel);
//            if (parent == null)
//                return;

//            var node = GetCurrentNode(context, parent);
//            if (node != null)
//            {
//                var fcm = node.ProjectItem.FileCodeModel;
//                if (fcm != null)
//                {
//                    var ce = IncrementalGenerator.RecursiveFind<EnvDTE.CodeElement>(fcm.CodeElements, c => c.FullName == parent.FullName);
//                    if (ce != null)
//                    {
//                        string oldName = null;
//                        if (propertyId == wrapper.NamePropertyId)
//                        {
//                            oldName = oldValue as string;
//                            if (String.IsNullOrWhiteSpace(oldName))
//                                return;
//                        }                        
//                        GenerateMemberCode(context, mel, ce, oldName);
//                    }
//                }
//            }
//        }

//        private void Rename(StrategyContext context, GenerationElementWrapper element, EnvDTE.CodeElement ce, string oldName)
//        {
//            if( String.IsNullOrWhiteSpace(oldName))
//                return;

//        }
//    }
//}
